import * as vscode from 'vscode';
import { MyWebviewViewProvider } from './sidebar';
import { registerMyInlineCompletion } from './inlineCompletionProvider';
import { startLanguageServer } from './languageServer';
import {
  registerExplainCodeCommand,
  registerTestProgressBarCommand,
} from './explainService';
import { LanguageClient } from 'vscode-languageclient/node';

let languageClient: LanguageClient | undefined;
export function activate(context: vscode.ExtensionContext) {
  /**
   * 1. 注册 webviewProvider 视图提供者
   * 2. 注册 demoView 视图
   */
  const webviewProvider = new MyWebviewViewProvider(
    vscode.Uri.file(context.extensionPath)
  );
  const demoView = vscode.window.registerWebviewViewProvider(
    MyWebviewViewProvider.viewName,
    webviewProvider
  );

  /**
   * 1. 注册 sendToLanguageServer 命令
   * 2. 通过命令发送请求到语言服务器 服务端
   * 3. 语言服务器返回结果
   */
  const sendToServerCommand = vscode.commands.registerCommand(
    'cw-vscode-ai.sendToLanguageServer',
    async (text: string) => {
      if (!languageClient) {
        throw new Error('语言服务器尚未初始化');
      }

      try {
        // 发送请求到语言服务器并返回结果
        const response = await languageClient.sendRequest(
          'custom/processMessage',
          { text }
        );
        return response;
      } catch (error) {
        console.error('发送消息到语言服务器失败:', error);
        throw error;
      }
    }
  );

  /**
   * 启动语言服务器
   */
  startLanguageServer(context).then((client: LanguageClient) => {
    console.log('语言服务器初始化成功');
    languageClient = client;
    // 启动语言客户端
    client.start().then(() => {
      vscode.window.showInformationMessage('语言服务器启动成功');

      /**
       * 监听 onDidChangeContent 文档发生变化时触发
       * 1. 接受语言服务器返回的文档内容
       * 2. 打印文档内容
       */
      client.onNotification('onDidChangeContent', (change) => {
        console.log('change.document._content::: ', change.document._content);
      });

      /**
       * 监听 custom/processMessage 通知
       * 1. 接受 语言服务器 服务端 返回的消息
       * 2. 将客户端 接收到的消息发送到  webview 侧边栏展示
       */
      client.onNotification('custom/processMessage', (params) => {
        console.log('接受到语言服务器 服务端 返回的消息::: ', params);
        webviewProvider.postMessage(params);
      });

      /**
       * 监听 textDocument/completion 通知 解决报错(TODO)
       */
      client.onNotification('textDocument/completion', (params) => {
        console.log('params---->', params);
      });
    });
  });

  /**
   * 提供内联代码提示
   * 1. 注册内联代码提示的提供者
   * 2. 当用户输入时触发内联代码提示
   */
  registerMyInlineCompletion(context);

  /**
   * 1. 注册内联代码提示的命令
   * 2. 通过命令发送请求到语言服务器 服务端
   * 3. 语言服务器返回结果
   */
  const inlineCompletionCommand = vscode.commands.registerCommand(
    'cw-vscode-ai.inlineCompletionRequest',
    async (text: string) => {
      if (!languageClient) {
        throw new Error('语言服务器尚未初始化');
      }

      try {
        // 发送请求到语言服务器并返回结果
        const response = await languageClient.sendRequest(
          'custom/inlineCompletion',
          { text }
        );
        console.log('语言服务器返回的内联补全结果:', response);
        return response;
      } catch (error) {
        console.error('发送内联补全请求到语言服务器失败:', error);
        throw error;
      }
    }
  );

  /**
   * 1. 调用 注册代码解释命令 cw-vscode-ai.explainCode
   */
  const explainCodeDisposable = registerExplainCodeCommand(context);

  /**
   * 1. 调用 注册测试进度条命令 cw-vscode-ai.testProgressBar
   * 2. 测试进度条
   */
  const testProgressBarDisposable = registerTestProgressBarCommand(context);



  /**
   * 注册所有的命令和视图
   */
  context.subscriptions.push(
    demoView,
    explainCodeDisposable,
    sendToServerCommand,
    testProgressBarDisposable,
    inlineCompletionCommand,
  );



 
}

export function deactivate() {}
